home *** CD-ROM | disk | FTP | other *** search
- #!/sbin/runscript
- # $Header: /var/cvsroot/gentoo-x86/media-sound/alsa-utils/files/alsasound-1.0.10_rc2,v 1.2 2005/12/15 22:42:46 flameeyes Exp $
- #
- # Gentoo users: add this script to 'boot' run level.
- # ==================================================
- #
- # alsasound This shell script takes care of starting and stopping
- # the ALSA sound driver.
- #
- # This script requires /usr/sbin/alsactl and /usr/bin/aconnect programs
- # from the alsa-utils package.
- #
- # Copyright (c) by Jaroslav Kysela <perex@suse.cz>
- #
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- # ChangeLog:
- #
- # 2003.07.29 - John Mylchreest <johnm@gentoo.org>
- # Edited to support Linux kernel 2.5 and above as well as 2.4
- #
- # 2004.06.02 - Jeremy Huddleston <eradicator@gentoo.org>
- # Rewritten for better support for built-in drivers
- #
- # 2004.10.29 - Jeremy Huddleston <eradicator@gentoo.org>
- # Cleaned up to work better for mixed builtin/module systems
- #
- # 2004.11.29 - Jeremy Huddleston <eradicator@gentoo.org>
- # Added save option thanks to Ben Anderson <roothorick@new.rr.com>
- #
- # 2005.04.21 - Jeremy Huddleston <eradicator@gentoo.org>
- # Added restore option and oss option.
- # Cleaned up code to use bash builtins instead of test.
-
- alsactl=/usr/sbin/alsactl
- asoundcfg=/etc/asound.state
- aconnect=/usr/bin/aconnect
- alsascrdir=/etc/alsa.d
-
- opts="${opts} save restore"
-
- depend() {
- need bootmisc localmount
- after modules isapnp coldplug hotplug
- }
-
- load_modules() {
- # List of drivers for each card.
- local DRIVERS="$(modprobe -c | grep -E "^[[:space:]]*alias[[:space:]]+snd-card-[[:digit:]]" | awk '{print $2}')"
-
- # Fall back on the automated aliases if we don't have ALSA configured properly...
- if [[ -z "${DRIVERS}" && ! ( -d /proc/asound && -z "$(grep ' no soundcards ' /proc/asound/cards)" ) ]] ; then
- ewarn "Could not detect custom ALSA settings. Loading all detected alsa drivers."
- DRIVERS="$(modprobe -c | grep pci: | awk '{ print $3 }' | grep snd.* | sort | uniq)"
- [[ -z "${DRIVERS}" ]] && eerror "Unable to find any ALSA drivers. Have you compiled alsa-drivers correctly?"
- fi
-
- if [[ ${ENABLE_OSS_EMUL} == "yes" ]] && modprobe -c | grep -q "snd.*oss$" ; then
- # Test for use of OSS
- local OSS="$(modprobe -l | grep "snd.*oss" | sed -e "s:\/.*\/::" -e "s:\..*::")"
- # Add oss modules to list
- local i
- for i in ${OSS}
- do
- DRIVERS="${DRIVERS} ${i}"
- done
- fi
-
- # We want to ensure snd-seq is loaded as it is needed for things like
- # timidity even if we don't use a real sequencer.
- DRIVERS="${DRIVERS} $(modprobe -l | grep "snd.seq\." | sed -e "s:\/.*\/::" -e "s:\..*::")"
-
- # We want to ensure snd-ioctl32 is loaded as it is needed for 32bit
- # compatibility
- DRIVERS="${DRIVERS} $(modprobe -l | grep "snd.ioctl32\." | sed -e "s:\/.*\/::" -e "s:\..*::")"
-
- local DRIVER
- for DRIVER in ${DRIVERS}
- do
- if [[ "${DRIVER}" != "off" &&
- -z $(cut -d' ' -f1 /proc/modules | egrep "^${DRIVER}\$") &&
- -z $(cut -d' ' -f1 /proc/modules | egrep "^${DRIVER//-/_}\$") ]] ; then
- ebegin " Loading: ${DRIVER}"
- /sbin/modprobe ${DRIVER}
- eend $?
- fi
- done
-
- sleep 1
-
- if [[ -f /proc/asound/seq/drivers ]] ; then
- local SEQUENCERS="$(awk -F, '$2~/^empty$/ {print $1}' /proc/asound/seq/drivers)"
- local SEQUENCER
- for SEQUENCER in ${SEQUENCERS}
- do
- if [[ -z $(cut -d' ' -f1 /proc/modules | egrep "^${SEQUENCER}\$") &&
- -z $(cut -d' ' -f1 /proc/modules | egrep "^${SEQUENCER//-/_}\$") ]] ; then
- ebegin " Loading: ${SEQUENCER}"
- /sbin/modprobe ${SEQUENCER}
- eend $?
- fi
- done
- fi
-
- for DRIVER in ${DRIVERS}
- do
- local TMP=${DRIVER##snd-}
- TMP=${TMP##snd_}
- if [[ -x "${alsascrdir}/${TMP}" ]] ; then
- ebegin " Running: ${alsascrdir}/${TMP}"
- ${alsascrdir}/${TMP}
- eend $?
- fi
- done
-
- if [[ ! -d /proc/asound || -n "$(grep ' no soundcards ' /proc/asound/cards)" ]] ; then
- eerror "ERROR: Failed to load necessary drivers"
- fi
- }
-
- unload_modules() {
- local LOADED_MODULES="$(/sbin/lsmod | grep -E "^snd" | awk '{print $1}')"
- local MODULE
- for MODULE in ${LOADED_MODULES}
- do
- /sbin/rmmod ${MODULE} >& /dev/null
- done
- /sbin/rmmod soundcore >& /dev/null
- /sbin/rmmod gameport >& /dev/null
-
- # Return success if the modules are unloaded
- [[ -z "$(/sbin/lsmod | grep -E "^snd" | awk '{print $1}')" ]]
- }
-
- terminate() {
- #
- # Kill processes holding open sound devices
- #
- # DEVS=`find /dev/ -follow -type c -maxdepth 1 -print 2>/dev/null | xargs ls -dils | grep "1*1[46]," | cut -d: -f2 | cut -d" " -f2; echo /proc/asound/dev/*`
- local ossdevs="/dev/admmidi? /dev/adsp? /dev/amidi? /dev/audio* /dev/dmfm* \
- /dev/dmmidi? /dev/dsp* /dev/dspW* /dev/midi0? /dev/mixer? /dev/music \
- /dev/patmgr? /dev/sequencer* /dev/sndstat"
- local alsadevs="/proc/asound/dev/* /dev/sound/* /dev/snd/*"
- fuser -k ${ossdevs} ${alsadevs} >& /dev/null
-
- #
- # remove all sequencer connections if any
- #
- [[ -f /proc/asound/seq/clients && -x ${aconnect} ]] && ${aconnect} --removeall
- }
-
- restore_mixer() {
- if [[ ${RESTORE_ON_START} == "no" ]] ; then
- return 0
- fi
-
- restore
- }
-
- restore() {
- ebegin "Restoring Mixer Levels"
-
- local val=0
-
- if [[ ! -r ${asoundcfg} ]] ; then
- ewarn "No mixer config in ${asoundcfg}, you have to unmute your card!"
- elif [[ -x ${alsactl} ]] ; then
- local CARDS="$(cat /proc/asound/cards | awk '/: / { print $1 }')"
- local CARDNUM
- for CARDNUM in ${CARDS}
- do
- [[ -e /dev/snd/controlC0 ]] || sleep 2
- [[ -e /dev/snd/controlC0 ]] || sleep 2
- [[ -e /dev/snd/controlC0 ]] || sleep 2
- [[ -e /dev/snd/controlC0 ]] || sleep 2
- ${alsactl} -f ${asoundcfg} restore ${CARDNUM} || ewarn "Errors while restoring defaults, ignoring"
- done
- else
- eerror -e "ERROR: Cannot find alsactl, did you forget to install media-sound/alsa-utils?"
- val=1
- fi
-
- eend ${val}
- return ${val}
- }
-
- save() {
- ebegin "Storing ALSA Mixer Levels"
-
- local val=0
-
- if [[ -x ${alsactl} ]] ; then
- ${alsactl} -f ${asoundcfg} store
- val=$?
- else
- eerror -e "ERROR: Cannot find alsactl."
- val=1
- fi
-
- eend ${val}
- return ${val}
- }
-
- start() {
- if [[ -f /proc/modules ]] ; then
- ebegin "Loading ALSA modules"
- if load_modules ; then
- eend 0
- else
- eend 1
- return 1
- fi
- fi
-
- if [[ ${RESTORE_ON_START} == "yes" ]]; then
- restore_mixer
- fi
- }
-
- stop() {
- if [[ ! -d /proc/asound ]] ; then
- eerror "ALSA is not loaded"
- return 0
- fi
-
- if [[ ${SAVE_ON_STOP} == "yes" ]]; then
- save
- fi
-
- ebegin "Unloading ALSA"
- terminate
- eend 0
-
- if [[ -f /proc/modules ]]; then
- ebegin "Unloading ALSA modules"
- if unload_modules; then
- eend 0
- else
- eend 1
- fi
- fi
- }
-